/*
 * mock_ordenamiento.cpp
 *
 *  Created on: Sep 9, 2012
 *      Author: m
 */

/*
 * Description: Simulador de Ordenamiento Aleatorio Externo.
 *
 * Invoke : desordenar input_file output_file
 *
 * */

#include <iostream>
#include <fstream>
#include <vector>
#include <cstdlib>
#include <algorithm>

using namespace std;

typedef struct
{
	long id;
	string value;
} data_t;

bool comparator( data_t a, data_t b )
{

	int comparison;

	if( a.id == b.id )
		comparison = a.value.compare( b.value );
	else
		comparison =  a.id - b.id;

	return comparison <= 0;
}

int main ( int argc, char *argv[] )
{

	if( argc != 3 )
		cerr << "Uso: desordenar input_file output_file" << endl;

	data_t auxiliar;
	vector<data_t> myVector;
	vector<data_t>::iterator it;


	ifstream fileIn( argv[1] );
	ofstream fileOut( argv[2] );

	// Inicializo el random generator para poder reproducir los resultados
	srand(0);

	cout << "leyendo datos" << endl;

	// Cargo los datos de entrada
	while( fileIn.good() )
	{
		auxiliar.id = rand();
		fileIn >> auxiliar.value;
		myVector.push_back( auxiliar );
	}

	cout << "datos leidos" << endl;


	// Ordeno los valores
	sort( myVector.begin(), myVector.end(), comparator );

	cout << "datos ordenados" << endl;

	// Re-escribo los valores ordenados en el archivo de salida

	for( it = myVector.begin(); it != myVector.end(); ++it )
	{
		fileOut << it->id << " " << it->value << endl;
	}

	return 0;
}

